#ifndef SESSIONFRIENDAPPLYAREA_H
#define SESSIONFRIENDAPPLYAREA_H

#include <QMouseEvent>
#include <QPushButton>
#include <QScrollArea>
#include <QWidget>
#include "Model/DataCenter.h"
#include "Style.h"

using namespace model;
class QLabel;
//////////////////////////////////////////////
/// 各种item的类型
//////////////////////////////////////////////
enum ItemType {
    SESSION_TYPE,
    FRIEND_TYPE,
    APPLY_TYPE
};
//////////////////////////////////////////////
/// 会话,好友,好友申请滚动区域
//////////////////////////////////////////////
class SessionFriendApplyArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendApplyArea(QWidget* parent = nullptr);
    /* 添加和清空元素 */
    void add_item(ItemType type, const QString& id, const QIcon& icon, const QString& name, const QString& last_message);
    void clear_item();
    /* 选中到指定坐标 */
    bool click_item(int index);
private:
    QWidget*       container;
    const QString& SCROLL_STYLE = get_scroll_area_style();
};
//////////////////////////////////////////////
/// 会话, 好友, 申请元素
//////////////////////////////////////////////
class SessionFriendApplyItem : public QWidget
{
    Q_OBJECT
public:
    SessionFriendApplyItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& last_message);
    /* 绘图事件, 自定义Widget需要用到 */
    void paintEvent(QPaintEvent* event) override;
protected:
    /* 处理鼠标事件 */
    void mousePressEvent(QMouseEvent* event) override;
    void enterEvent(QEnterEvent* event) override;
    void leaveEvent(QEvent* event) override;
protected:
    QWidget*    owner;        // 被哪个SessionFriendApplyArea使用
    QLabel*     u_last_mes;   // 最后一条消息
    bool        is_selected;  // 是否被选中
    DataCenter* data_center;
public:
    /* 一些被多次调用的函数 */
    void         check_select();
    virtual void active() = 0;
};
//////////////////////////////////////////////
/// 会话类型
//////////////////////////////////////////////
class SessionItem : public SessionFriendApplyItem
{
    Q_OBJECT
public:
    SessionItem(const QString& chat_session_id, QWidget* owner, const QIcon& avatar,
                const QString& name, const QString& last_message);
    void active() override;
private:
    void    handle_update_last_message(const QString& chat_session_id);
    QString chat_session_id;
    QString pure_last_msg;  // 没有[未读n条]的最后一条消息
};
//////////////////////////////////////////////
/// 好友类型
//////////////////////////////////////////////
class FriendItem : public SessionFriendApplyItem
{
    Q_OBJECT
public:
    FriendItem(const QString& user_id, QWidget* owner, const QIcon& avatar,
               const QString& name, const QString& last_message);
    void active() override;
private:
    QString user_id;
};
//////////////////////////////////////////////
/// 好友申请类型
//////////////////////////////////////////////
class FriendApplyItem : public SessionFriendApplyItem
{
    Q_OBJECT
public:
    /// @brief 初始化好友申请信息
    FriendApplyItem(const QString& user_id, QWidget* owner, const QIcon& avatar,
                    const QString& name);
    void active() override;
private:
    QPushButton* ac_btn;   // 同意按钮
    QPushButton* rej_btn;  // 拒绝按钮
    QString      user_id;  // 申请人的id
};
#endif                     // SESSIONFRIENDAPPLYAREA_H
